package com.doumuxie.handler;

import com.doumuxie.dto.ConsumeDto;
import com.doumuxie.dto.GoodsDto;
import com.doumuxie.dto.ProductDto;
import com.doumuxie.frame.ProductConsumeFrame;
import com.doumuxie.frame.ProductConsumePanel;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @author doumuxie https://gitee.com/doumuxie/
 * @version 1.0
 * @date 2020/9/26 9:04
 * @description 生产者消费者相关处理
 **/
public class ProductConsumeHandler {

    private static int inIndex = 0;

    /**
     * 保存所有生产者
     */
    public static List<ProductDto> productDtoList = new ArrayList<>();
    /**
     * 保存所有消费者
     */
    public static List<ConsumeDto> consumeDtoList = new ArrayList<>();

    /**
     * 保存所有产品
     */
    public static LinkedList<GoodsDto> goodsDtoLinkedList = new LinkedList<>();


    /**
     * 重绘panel
     *
     * @param frame frame
     */
    public static void drawProduct(ProductConsumeFrame frame) {
        // 重绘panel
        frame.getProductConsumePanel().drawProduct();
    }

    /**
     * 是否生产/消费 中
     */
    public static boolean isRunning = false;

    /**
     * 同步方法处理， 生产和消费不可同时进行
     *
     * @param dto  生产者生产的产品
     * @param type 1 代表生产 2 代表消费
     * @return 消费时 返回 产品dto
     */
    public synchronized static GoodsDto syncDeal(GoodsDto dto, int type) {
        System.err.println(isRunning);
        if (type == 1) {
            // 入队列
            if (goodsDtoLinkedList.size() >= 5) {
                System.err.println("生产上限");
                return null;
            } else {
                // 尾插
                if (goodsDtoLinkedList.size() > 0) {
                    dto.setId(Integer.parseInt(goodsDtoLinkedList.get(0).getId()) + 1 + "");
                }
                dto.setProductId(productDtoList.get(inIndex).getId());
                ProductConsumePanel.drawMoveOval(1, inIndex++);
                if (inIndex >= productDtoList.size()) {
                    inIndex = 0;
                }
                goodsDtoLinkedList.addLast(dto);
            }
        } else {
            // 出队列
            if (goodsDtoLinkedList.size() > 0) {
                GoodsDto pop = goodsDtoLinkedList.pop();
                for (int i = 0; i < productDtoList.size(); i++) {
                    if (productDtoList.get(i).getId().equals(pop.getProductId())) {
                        ProductConsumePanel.drawMoveOval(2, i);
                        break;
                    }
                }
                delay();
                System.out.println("消费成功_" + pop.getId());
                return pop;
            } else {
                return null;
            }
        }
        delay();
        return null;
    }

    private static void delay() {
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    /**
     * 产品出队列 代表开始被消费
     *
     * @return GoodsDto
     */
    public static GoodsDto getFrontGoods() {
        return syncDeal(null, 2);
    }

    /**
     * 产品入队列 代表生产成功
     *
     * @param dto 产品
     */
    public static void insertGoods(GoodsDto dto) {
        syncDeal(dto, 1);
    }


}
